package section4_5;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by Hyman on 2017/6/7.
 *
 * 运行多个任务并处理第一个结果
 *
 * ThreadPoolExecutor的invokeAny方法接收到一个任务列表，然后运行任务，
 *  并返回第一个完成任务并且没有抛出异常的任务的执行结果。这个方法返回的类型与任务里的call方法返回的类型相同
 *
 * 范例允许用户可以通过两种验证机制进行验证，但是，只要有一种机制验证成功，那么这个用户就被验证通过了
 */
public class Main {

    public static void main(String[] args) {

        String name = "test";
        String password = "test";

        UserValidator ldapValidator = new UserValidator("LDAP");
        UserValidator dbValidator = new UserValidator("DataBase");

        TaskValidator ldapTask = new TaskValidator(name, password, ldapValidator);
        TaskValidator dbTask = new TaskValidator(name, password, dbValidator);

        List<TaskValidator> taskList = new ArrayList<>();
        taskList.add(ldapTask);
        taskList.add(dbTask);

        //使用Executors类的newCachedThreadPool()方法创建一个新的ThreadPoolExecutor对象和一个类型为String，
        ExecutorService executor = Executors.newCachedThreadPool();
        String result;

        try {
            // 调用executor对象的invokeAny()方法。该方法接收taskList参数，返回String类型。
            // 同样，它将该方法返回的String对象写入到控制台。
            result = executor.invokeAny(taskList);
            System.out.printf("Main: Result: %s\n", result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        // 使用shutdown()方法结束执行者，写入一条信息到控制台，表明程序已结束。
        executor.shutdown();
        System.out.printf("Main: End of the Execution\n");
    }
}
